package com.gxc.string;

import java.util.*;

/**
 * 企业路由器的统计页面，有一个功能需要动态统计公司访问最多的网页URL top N。请设计一个算法，可以高效动态统计Top N的页面。
 *
 * 输入描述
 * 每一行都是一个URL或一个数字，如果是URL，代表一段时间内的网页访问； 如果是一个数字N，代表本次需要输出的Top N个URL。
 *
 * 输入约束：
 *
 * 1、总访问网页数量小于5000个，单网页访问次数小于65535次；
 * 2、网页URL仅由字母，数字和点分隔符组成，且长度小于等于127字节； 3、数字是正整数，小于等于10且小于当前总访问网页数；
 *
 * 输出描述
 * 行输入要对应一行输出，输出按访问次数排序的前N个URL，用逗号分隔。
 *
 * 输出要求：
 *
 * 1、每次输出要统计之前所有输入，不仅是本次输入；
 * 2、如果有访问次数相等的URL，按URL的字符串字典序升序排列，输出排序靠前的URL；
 */
public class StatisticsPage {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        List<String> lines = new ArrayList<>();
        Map<String, java.lang.Integer> cache = new HashMap<>();
        while (scanner.hasNext()) {
            String line = scanner.nextLine();
            lines.add(line);
            if (line.matches("^\\d+$")) {
                System.out.println(sortUrl(lines, cache));
                lines.clear();
            }
        }
    }

    private static String sortUrl(List<String> lines, Map<String, java.lang.Integer> cache) {
        int n = java.lang.Integer.parseInt(lines.remove(lines.size() - 1));
        for (int i = 0; i < lines.size(); i++) {
            cache.put(lines.get(i), cache.getOrDefault(lines.get(i), 0) + 1);
        }

        List<Map.Entry<String, java.lang.Integer>> list = new ArrayList<>(cache.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, java.lang.Integer>>() {
            @Override
            public int compare(Map.Entry<String, java.lang.Integer> o1, Map.Entry<String, java.lang.Integer> o2) {
                int i = o2.getValue() - o1.getValue();
                return i == 0 ? o1.getKey().compareTo(o2.getKey()) : i;
            }
        });

        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < n && i < list.size(); i++) {
            Map.Entry<String, java.lang.Integer> stringIntegerEntry = list.get(i);
            String key = stringIntegerEntry.getKey();
            builder.append(key).append(",");
        }
        if (builder.length() > 0) {
            builder.deleteCharAt(builder.length() - 1);
        }
        return builder.toString();
    }
}
